package com.justnow.math;

/**
 * @author justnow
 * Created on 2020-10-08
 * Description
 *
 * 求x的平方根
 *
 * 计算并返回 x 的平方根，其中 x 是非负整数。
 *
 * 由于返回类型是整数，结果只保留整数的部分，小数部分将被舍去。
 *
 *
 */
public class Leetcode69 {

    /**
     * 方法一，使用二分法
     * @param x
     * @return
     */
    public static int mySqrt(int x) {
        int low = 0;
        int high = x;
        while (low <= high) {
            long mid = (long)(low + high) / 2;
            if (mid * mid < x) {
                low = (int)mid + 1;
            } else if (mid * mid > x) {
                high = (int)mid - 1;
            } else {
                return (int)mid;
            }
        }
        return high;
    }

    /**
     * 方法二，使用数学公式
     * @param x
     * @return
     */
    public int mySqrt2(int x) {
        if (x == 0) {
            return 0;
        }

        int ans = (int)Math.exp(0.5 * Math.log(x));
        return (long)(ans + 1) * (ans + 1) <= x ? ans + 1 : ans;
    }

}
